#include <iostream>
#include <cstring>
#include "acl/acl.h"

/*aclError aclrtSetDevice(deviceId)
{
    int fd = open("/dev/npu1");

}

aclError aclrtMalloc(&devPtr, 100, ACL_MEM_MALLOC_HUGE_FIRST)
{
    write(fd, "帮我申请50MB的内存");
    devPtr = read(fd);
}

aclError aclrtMemcpy(devPtr, 100, (void*)hostPtr1, 100, ACL_MEMCPY_DEVICE_TO_DEVICE)
{
    write(fd, "拷贝4字节的数据到NPU上");
    for (int i = 0; i < 4; i++)
    {
        write(fd, hostPtr1 + i);
        write(fd, 'A');
    }
}

aclError aclrtMemcpy((void*)hostPtr2, 100, devPtr, 100, ACL_MEMCPY_DEVICE_TO_DEVICE)
{
    write(fd, "从NPU显存上拷贝4字节到CPU内存上");
    for (int i = 0; i < 4; i++)
    {
        hostPtr2[i] = read(fd, devPtr + i);
    }
}*/

using namespace std;

int main(int argc, char *argv[])
{
    int32_t deviceId = 0;

    // 初始化昇腾设备
    aclError ret = aclInit("");
    ret = aclrtSetDevice(deviceId);


    // 在npu显存上分配空间
    void * devPtr;
    ret = aclrtMalloc(&devPtr, 100, ACL_MEM_MALLOC_HUGE_FIRST);
    cout << "aclrtMalloc ret is " << ret << "." << endl;


    // 在cpu内存上分配空间1
    char * hostPtr1 = (char*)malloc(100);
    memset(hostPtr1, 0, 100);   // 将分配的100字节空间赋值为0
    memset(hostPtr1, 'A', 4);   // 将100字节空间的前4个字节赋值为A


    // 将cpu内存数据拷贝到npu显存上
    ret = aclrtMemcpy(devPtr, 100, (void*)hostPtr1, 100, ACL_MEMCPY_DEVICE_TO_DEVICE);  // 香橙派 和 Atlas200DK(A2)使用这个
    // ret = aclrtMemcpy(devPtr, 100, (void*)hostPtr1, 100, ACL_MEMCPY_HOST_TO_DEVICE); // 其他设备用这个
    cout << "aclrtMemcpy1 ret is " << ret << "." << endl;


    // 在cpu内存上分配空间2
    char * hostPtr2 = (char*)malloc(100);
    ret = aclrtMemcpy((void*)hostPtr2, 100, devPtr, 100, ACL_MEMCPY_DEVICE_TO_DEVICE);  // 香橙派 和 Atlas200DK(A2)使用这个
    // ret = aclrtMemcpy((void*)hostPtr2, 100, devPtr, 100, ACL_MEMCPY_DEVICE_TO_HOST); // 其他设备用这个
    cout << "aclrtMemcpy2 ret is " << ret << "." << endl;
    cout << "hostPtr2 data is " << hostPtr2 << "." << endl;


    // 释放资源
    ret = aclrtResetDevice(deviceId);
    ret = aclFinalize();


    return 0;
}
